GO
0. Vim初相识
0.1 Vim简介
Vim是从Vi发展出来,第一个版本由布拉姆米勒在1991年发布,它基于VIM许可证,兼容GPL。官网www.vim.org
0.2 Vim的安装和使用
- 安装:
yum install -y vim-enhanced
- 使用:
vim filename
1. Vim的模式
(这节内容摘抄自Vim-维基百科)
Vim有6种基本模式和5种派生模式:
1.1 基本模式
- 普通模式
在普通模式中,用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式。
在普通模式中,有很多方法可以进入插入模式。比较普通的方式是按”a”(append/追加)键或者”i”(insert/插入)键。
- 插入模式
在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这个模式。
在插入模式中,可以按ESC键回到普通模式。
- 可视模式
这个模式与普通模式比较相似。但是移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。Vim的”文本对象”也能和移动命令一样用在这个模式中。
- 选择模式
这个模式和无模式编辑器的行为比较相似(Windows标准文本控件的方式)。这个模式中,可以用鼠标或者光标键高亮选择文本,不过输入任何字符的话,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。
- 命令行模式
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(”:”键),搜索(”/“和”?”键)或者过滤命令(”!”键)。在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
- Ex模式
这和命令行模式比较相似,在使用”:visual”命令离开Ex模式前,可以一次执行多条命令。
1.2 派生模式
- 操作符等待模式
这个派生模式指普通模式中,执行一个操作命令后Vim等待一个”动作”来完成这个命令。Vim也支持在操作符等待模式中使用”文本对象”作为动作,包括”aw”一个单词(a word)、”as”一个句子(a sentence)、”ap”一个段落(a paragraph)等等。
比如,在普通模式下”d2as”删除当前和下一个句子。在可视模式下”apU”把当前段落所有字母大写。
- 插入普通模式
这个模式是在插入模式下按下ctrl-o键的时候进入。这个时候暂时进入普通模式,执行完一个命令之后,Vim返回插入模式
- 插入可视模式
这个模式是在插入模式下按下ctrl-o键并且开始一个可视选择的时候开始。在可视区域选择取消的时候,Vim返回插入模式。
- 插入选择模式
通常这个模式由插入模式下鼠标拖拽或者shift方向键来进入。当选择区域取消的时候,Vim返回插入模式。
- 替换模式
这是一个特殊的插入模式,在这个模式中可以做和插入模式一样的操作,但是每个输入的字符都会覆盖文本缓冲中已经存在的字符。在普通模式下按”R”键进入。
1.3 其它
- Evim(Easy Vim)
Evim(Easy Vim)是一个特殊的GUI模式用来尽量的表现的和”无模式”编辑器一样。编辑器自动进入并且停留在插入模式,用户只能通过菜单、鼠标和键盘控制键来对文本进行操作。可以在命令行下输入”evim”或者”vim -y”进入。在Windows下,通常也可以点击桌面上Evim(Easy Vim)的图标。
1.4 说明
一般情况下,我们通常只使用三种模式(其它的模式可能会在我们使用过程中不经意就会用上,所以初学时不要在模式上花费太大的精力,只需要搞懂这常用的三种就足够了):
- 普通模式
- 插入模式
- 命令行模式
以下的内容也是针对这三种常用模式的学习。
2. Vim的使用
2.1 进入Vim
- vim 进入Vim软件环境
- vim filename 用Vim打开或新建一个文件
2.2 三种常用模式之间的切换
2.2.1 进入普通模式
- 一般用Vim打开文件时的默认模式就是普通模式。
- 如果是在别的模式下,按Esc键 就会切换到普通模式。
- 同上,按 Ctrl+C 或者 Ctrl+[ 效果也同 按Esc键。
2.2.2 进入插入模式
一般是从默认的普通模式进入到插入模式,常用的方式如下表所示:
按键 | 说明 |
---|---|
i | 在当前光标的前面插入 |
I | 在当前光标所在行的行首插入 |
a | 在当前光标的后面插入 |
A | 在当前光标所在行的行尾插入 |
o | 在当前光标所在行的下面新插入一行 |
O | 在当前光标所在行的上面新插入一行 |
cw | 替换从光标所在位置后到一个单词结尾的字符 |
2.2.3 进入命令行模式
一般是从默认的普通模式进入到命令行模式,方式如下表所示:
按键 | 说明 |
---|---|
: | 冒号后面加一些命令 |
/ | 进行查找替换时前面要用它 |
? | 进行查找时前面要用它 |
2.2.4 关于模式之间相互切换的说明
- 普通模式和插入模之间可以相互切换。
- 普通模式和命令行模式之间可以相互切换。
- 插入模式和命令行模式之间不可以直接切换,只能先从一种模式中切换到普通模式,才能再切换到另一个模式。
2.3 光标移动
光标移动
按键 | 说明 |
---|---|
h/左箭头 | 左 |
l/右箭头 | 右(小写L) |
j/下箭头 | 下 |
k/上箭头 | 上 |
行间跳转
命令 | 说明 |
---|---|
nG(n Shift+g) | 光标移动到第n行 |
gg | 光标移动到第一行 |
G(Shift+g) | 到最后一行 |
小技巧:你在完成依次跳转后,可以使用Ctrl+o快速回到上一次(跳转前)光标所在位置,这个技巧很实用,比如当你在写代码时,忽然想起有个bug,需要修改,这时候你跳过去改好了,只需要按下Ctrl+o就可以回到你之前的位置。
行内跳转
命令 | 说明 |
---|---|
w | 到下一个单词的开头 |
e | 到下一个单词的结尾 |
b | 到前一个单词的开头 |
ge | 到前一个单词的结尾 |
0或^ | 到行头 |
$ | 到行尾 |
f<字母> | 向后搜索<字母>并跳转到第一个匹配的位置(非常实用) |
F<字母> | 向前搜索<字母>并跳转到第一个匹配的位置 |
t<字母> | 向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用) |
T<字母> | 向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用) |
2.4 操作文本
2.4.1 删除文本
普通模式下删除Vim文本信息
操作 | 说明 |
---|---|
x(小写) | 删除光标所在的字符 |
X(大写) | 删除光标所在前一个字符 |
Delete | 同x |
dd | 删除(实际上是剪切,可用p来粘贴)光标所在行 |
dw | 删除一个单词(不适合中文) |
d$或D | 删除至行尾 |
d^ | 删除至行首 |
dG | 删除至文档结尾处 |
d1G | 删除至文档首部 |
除此之外,还可以在命令之前加上数字,表示多次删除1行,即一次删除多行。
2.4.2 复制粘贴和剪切
在普通模式下进行复制粘贴和剪切的操作
操作 | 说明 |
---|---|
yy | 复制光标所在行的整行 |
3yy | 复制3行 |
y^ | 复制至行首的第一个字符,不包含光标所在处字符 |
y0 | 同上 |
yw | 复制一个单词 |
y2w | 复制两个单词 |
yG | 复制至文本末 |
y1G | 复制至文本开头 |
p(小写) | 粘贴至光标后(下) |
P(大写) | 粘贴至光标前(上) |
dd | 剪切光标所在行的整行 |
ddp | 快速交换光标所在行与它下面的行 |
剪切的操作 | 同复制的操作一致,以此类推 |
2.4.3 替换和撤销(Undo)
在普通模式下进行
操作 | 说明 |
---|---|
r+<待替换字母> | 将光标所在字母替换为指定字母 |
R | 连续替换,直到按下Esc |
cc | 替换整行,即删除光标所在行,并进入插入模式 |
cw | 替换一个单词,即删除一个单词,并进入插入模式 |
C(大写) | 替换光标以后至行末 |
~ | 反转光标所在字母大小写 |
u{n} | 撤销一次或n次操作 |
U(大写) | 撤销当前行的所有修改 |
Ctrl+r | redo,即撤销undo的操作 |
2.4.4 查找
在普通模式下进行
操作 | 说明 |
---|---|
/<字符串> | 向下进行查找 |
?<字符串> | 向上进行查找 |
n(小写) | 继续相同侧的查找 |
N(大写) | 继续相反侧的查找 |
\* | 向下查找光标所在处的单词 |
\# | 向上查找光标所在处的单词 |
g\* | 同\*,但部分符合该单词即可 |
g\# | 同\#,但部分符合该单词即可 |
补充说明:
2.4.5 快速缩进
使用快速缩进,用于格式化代码超爽,在普通模式下进行
操作 | 说明 |
---|---|
>> | 将整行向右缩进 |
<< | 将整行向左回退 |
:set shiftwidth=n | 设置缩进和回退的字符数(可以简写成sw) |
:ce | 使本行内容居中 |
:ri | 使本行内容靠右 |
:le | 使本行内容靠左 |
2.5 Vim重复命令和设置
2.5.1 Vim重复命令
- 重复执行上次命令:在普通模式下,.(小数点)表示重复上一次的命令操作。
- 执行指定次数相同的命令:在普通模式输入数字N,N表示重复后面操作的次数。几个例子如下:
- 输入
10x
,删除10个连续字符 - 输入
3dd
,将会删除3行文本 - 在普通模式下,还可以使用
dw
或者daw
(delete a word)删除一个单词,所以可以联想到dnw
(n替换为相应数字)表示删除n个单词。
- 输入
2.5.2 Vim常用设置
- :set nu 显示行号
- :set shiftwidth=n 设置缩进和回退的字符数(可以简写成sw–> :set sw=n )
- :set nohl 取消查找关键字后的高亮
2.6 退出Vim
命令行模式下退出Vim
命令 | 说明 |
---|---|
:q! | 强制退出,不保存 |
:q | 退出 |
:wq! | 强制保存并退出 |
:w <文件路径> | 另存为 |
:saveas <文件路径> | 另存为 |
:x | 保存并退出 |
:wq | 保存并退出 |
- 普通模式下输入 ZZ(Shift+zz) 即可退出(若文件改动,则保存,否则不保存)
3. Vim初学的补充
3.1. 正常模式下的命令格式
在正常模式下一个命令的格式是∶
[number] command object 或者 command [number] object
其意是∶
- number - 代表的是命令执行的次数
- command - 代表要做的事情,比如 d 代表删除
- object - 代表要操作的对象,比如 w 代表单字/单词,$ 代表到行末等等。
- $ (to the end of line), etc.
3.2. 括号匹配
如果光标当前位置是括号(、)、[、]、{、},按 % 可以将光标移动到配对的括号上。
3.3. 字符替换
- 在一行内替换头一个字符串 old 为新的字符串 new,请输入
:s/old/new
- 在一行内替换所有的字符串 old 为新的字符串 new,请输入
:s/old/new/g
- 在两行内替换所有的字符串 old 为新的字符串 new,请输入
:#,#s/old/new/g
- 在文件内替换所有的字符串 old 为新的字符串 new,请输入
:%s/old/new/g
- 进行全文替换时询问用户确认每个替换需添加 c 选项,请输入
:%s/old/new/gc
3.4. Vim的在线帮助命令
Vim 拥有一个细致全面的在线帮助系统。要启动该帮助系统,请选择如下三种方法之一∶
- 按下
<HELP>
键 (如果键盘上有的话) - 按下
<F1>
键 (如果键盘上有的话) - 输入
:help <回车>
- 输入
:q <回车>
可以关闭帮助窗口。
提供一个正确的参数给”:help”命令,您可以找到关于该主题的帮助。请试验以下参数(可别忘了按回车键哦)∶
:help w <回车>
:help insert-index <回车>
:help user-manual <回车>
- vim手册,使用的命令是∶
:help user-manual
4. Vim高级功能
4.1. 多文件编辑
4.1.1 使用Vim编辑多个文件
编辑多个文件有两种形式,一种是在进入Vim前使用的参数就是多个文件,另一种就是进入Vim后再编辑其他的文件。
同时创建两个新文件并编辑:
vim 1.txt 2.txt
默认进入1.txt文件的编辑界面- 命令行模式下输入
:n
编辑2.txt文件,可以加!即:n!
强制切换,之前一个文件的输入内容没有保存,仅仅切换到另一个文件 - 命令行模式下输入
:N
编辑1.txt文件,可以加!即:N!
强制切换,之前文件内的输入没有保存,仅仅是切换到另一个文件。
4.1.2 进入Vim后打开新文件
命令行模式下的操作:
操作 | 说明 |
---|---|
:e 3.txt | 打开新文件3.txt |
:e# | 回到前一个文件 |
:ls | 可以列出以前编辑过的文档 |
:b 2.txt(或者编号) | 可以直接进入文件2.txt编辑 |
:bd 2.txt(或者编号) | 可以删除以前编辑过的列表中的文件项目 |
:e! 4.txt | 新打开文件4.txt,放弃正在编辑的文件 |
:f | 显示正在编辑的文件名 |
:f new.txt | 改变正在编辑的文件名字为new.txt |
4.1.3 恢复文件
如果因为断电等原因造成文档没有保存,可以采用恢复方式:
vim -r
进入文档后,输入:ewcover 1.txt
来恢复。
4.2. 可视模式
- 在普通模式下输入
v(小写)
,进入字符选择模式,就可以移动光标,光标走过的地方就会选取。再次按下v会后就会取消选取。 - 在普通模式下输入
Shift+v(小写)
,进入行选择模式,按下V之后就会把整行选取,您可以上下移动光标选更多的行,同样,再按一次Shift+v就可以取消选取。 - 在普通模式下输入
Ctrl+v(小写)
,这是区域选择模式,可以进行矩形区域选择,再按一次Ctrl+v取消选取。 - 在普通模式下输入
d
删除选取区域内容 - 在普通模式下输入
y
复制选取区域内容
4.3. 视窗操作
vim可以在一个界面里打开多个窗口进行编辑,这些编辑窗口称为vim的视窗。打开方法有很多种,例如可以使用在命令行模式下输入:new
打开一个新的vim视窗,并进入视窗编辑一个新文件(普通模式下输入Ctrl+w
也可以,但是Ctrl+w
在chrome下会与chrome关闭标签页的快捷键冲突,所以使用该快捷键你可以在IE或其它浏览器进行练习),除了:new
命令,下述列举的多种方法也可以在命令模式或普通模式下打开新的视窗:
- 命令行模式下输入
:sp 1.txt
打开新的横向视窗来编辑1.txt - 命令行模式下输入
:vsp 2.txt
打开新的纵向视窗来编辑1.txt - 普通模式下
Ctrl-w s
将当前窗口分割成两个水平的窗口 - 普通模式下
Ctrl-w v
将当前窗口分割成两个垂直的窗口 - 普通模式下
Ctrl-w q
即:q
结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!
- 普通模式下
Ctrl-w o
打开一个视窗并且隐藏之前的所有视窗 - 普通模式下
Ctrl-w j
移至下面视窗 - 普通模式下
Ctrl-w k
移至上面视窗 - 普通模式下
Ctrl-w h
移至左边视窗 - 普通模式下
Ctrl-w l
移至右边视窗 - 普通模式下
Ctrl-w J
将当前视窗移至下面 - 普通模式下
Ctrl-w K
将当前视窗移至上面 - 普通模式下
Ctrl-w H
将当前视窗移至左边 - 普通模式下
Ctrl-w L
将当前视窗移至右边 - 普通模式下
Ctrl-w -
减小视窗的高度 - 普通模式下
Ctrl-w +
增加视窗的高度
4.4. 文档加密
vim -x file1
输入您的密码确认密码这样在下一次打开时,vim就会要求你输入密码
4.5. 在Vim执行外部命令
在命令行模式中输入!
可以执行外部的shell命令:
:!ls
用于显示当前目录的内容:!rm FILENAME
用于删除名为 FILENAME 的文件:w FILENAME
可将当前 VIM 中正在编辑的文件另存为 FILENAME 文件
4.6. Vim的帮助系统
- 普通模式下按
<F1>
打开vim自己预设的帮助文档 - 命令行模式下输入
:h shiftwidth
打开名为shiftwidth的帮助文件 - 命令行模式下输入
:ver
显示版本及参数
4.7. 功能设定
4.7.1 Vim的功能设定
可以在编辑文件的时候进行功能设定,如命令行模式下输入:set nu
(显示行数),设定值退出vim后不会保存。要永久保存配置需要修改vim配置文件。vim的配置文件~/.vimrc
,可以打开文件进行修改,不过务必小心不要影响vim正常使用
4.7.2 获取目前的设定
- 命令行模式下输入
:set
或者:se
显示所有修改过的配置 - 命令行模式下输入
:set all
显示所有的设定值 - 命令行模式下输入
:set option?
显示option的设定值
-命令行模式下输入:set nooption
取消当期设定值
4.7.3 set功能的说明
- 命令行模式下输入
:set autoindent(ai)
设置自动缩进 - 命令行模式下输入
:set autowrite(aw)
设置自动存档,默认未打开 - 命令行模式下输入
:set background=dark或light
,设置背景风格 - 命令行模式下输入
:set backup(bk)
设置自动备份,默认未打开 - 命令行模式下输入
:set cindent(cin)
设置C语言风格缩进
5. Vim使用技巧总结
5.1. Vim一些常用使用技巧总结
操作 | 说明 |
---|---|
Ctrl-C | 回到普通模式 |
u / Ctrl+r | 撤销/反撤销 |
9G / :9 | 定位到第9行 |
:9y | 拷贝第9行 |
Ctrl-o | 回到此前光标位置 |
ZZ / ZQ | 保存并退出/无条件退出 |
= | 格式化选定文本 |
ggvG | 全选文件内容 |
gg=G | 格式化文件 |
Shift-v | 选取行 |
vip | 选取光标所在段落 |
yit / dit / cit | 对标签内的文本进行操作 |
mx | 添加书签 |
`X | 跳转到书签X |
:marks | 查看所有书签X |
delm X | 删除书签X |
:ls | 查看缓冲区 |
:bN | 打开缓冲区N |
:bn / bp / | 缓冲区切换 |
:shell / :sh /!cmd | 执行shell命令 |
Ctrl-z / fg | 利用了Linux的作业机制,将Vim进程放到后台/前台执行,便于使用shell环境 |
vim -o *.py | 打开当前目录下全部.py文件 |
:qa | 退出全部窗口 |
vnew | 垂直分屏 |
Ctrl-w r | 切换缓冲区 |
:r filename | 将文件读入到当前光标位置 |
Windo diffthis/diffof | 对比当前打开的两个缓冲区 |
:e! | 重新打开缓冲区 |
:s/foo/bar/gc | 查找foo并将其替换成bar |
:1?xxx / G?xxx | 从文件末尾开始查找 |
Shift-k | 查找光标所在命令或函数的man帮助 |
J | 合并行 |
gi / gk | 对于换行的段落的行移动 |
Ctrl-g | 用于显示当前光标所在位置和文件状态信息。 |
:!command | 用于执行一个外部命令 command。 |
:w FILENAME | 可将当前 VIM 中正在编辑的文件保存到名为 FILENAME 的文件中。 |
:#,#w FILENAME | 可将当前编辑文件第 # 行至第 # 行的内容保存到文件FILENAME 中。 |
:r FILENAME | 可提取磁盘文件 FILENAME 并将其插入到当前文件的光标位置后面。 |
5.2. Vim键盘图
图一
图二
图三
OK